using System.Collections;
using System.Collections.Generic;
using UnityEngine;



/// <summary>
/// 框架的入口
/// 挂载在root节点上，保证不可销毁
/// </summary>
public class GameStart : MonoBehaviour
{
    //用于在unity编辑器初始化控游戏运行模式
    public GameMode GameMode;
    public bool OpenLog;
    private void Awake()
    {
        //初始化游戏模式
        AppConst.GameMode = this.GameMode;
        //保证不会因为切换场景而销毁对象
        DontDestroyOnLoad(this);
    }
    void Start()
    {
        //数字添加事件非常不直观,因此在常量类中添加一个枚举，用来添加事件
        //Manager.Event.Subscribe(10000, OnLuaInit);
        Manager.Event.Subscribe((int)GameEvent.StartLua, StartLua);
        //为什么要把下面这个方法定义成事件：需要在更新完成后执行，如果直接写在下面执行函数，就会在刚添加热更新的时候立马执行，加载的都是未更新的老资源
        Manager.Event.Subscribe((int)GameEvent.GameInit, GameInit);
        AppConst.GameMode = this.GameMode;
        AppConst.OpenLog = this.OpenLog;

        if (AppConst.GameMode == GameMode.UpdateMode)
            this.gameObject.AddComponent<HotUpdate>();
        else
            Manager.Event.Fire((int)GameEvent.GameInit);


        //调用lua函数有两种方式：
        //1.lua脚本中调用，在c#中直接require对应的脚本就可以
        //2.在c#中调用（通过LuaEnv.Global.Get），一般用于测试，全局查找效率低
        //XLua.LuaFunction func = Manager.Lua.LuaEnv.Global.Get<XLua.LuaFunction>("Main");
        //func.Call();
        //执行lua脚本，根据注册的loader加载（注册的loader是从缓存字典中通过键返回byte数组）

        //会出现一种情况，即Init()异步加载还没完成，就调用了这个函数。因此为了实现异步加载，同步使用，需要传入回调
        //Manager.Lua.StartLua("Main");

    }

    private void GameInit(object args)
    {
        //放在start中，保证LuaEnv先实例化
        //解析版本文件，获取lua文件名列表
        if (AppConst.GameMode != GameMode.EditorMode)
        {
            //编辑器模式下不需要解析版本文件，因为不从ab包中加载资源
            Manager.Resource.ParseVersion();
        }
        //初始化，加载到缓存
        Manager.Lua.Init();
    }
    //以On为前缀的函数，一般是事件函数/回调函数，在发生特定事件的时候调用
    void StartLua(object args)
    {
        //加载lua脚本，调用主入口函数
        Manager.Lua.StartLua("main");
        XLua.LuaFunction func = Manager.Lua.LuaEnv.Global.Get<XLua.LuaFunction>("Main");
        func.Call();

        Manager.Pool.CreatGameObjectPool("UI", 10);
        Manager.Pool.CreatGameObjectPool("Monster", 120);
        Manager.Pool.CreatGameObjectPool("Effect", 120);
        Manager.Pool.CreatAssetPool("AssetBundle", 10);
    }

    private void OnApplicationQuit()
    {
        //上面订阅，下面必须取消全部订阅
        Manager.Event.UnSubscribe((int)GameEvent.GameInit, GameInit);
        Manager.Event.UnSubscribe((int)GameEvent.StartLua, StartLua);
    }
}
